winsafe\psapi\handles/
hprocess.rs

1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::decl::*;
4use crate::kernel::privs::*;
5use crate::prelude::*;
6use crate::psapi::ffi;
7
8impl HPROCESS {
9	/// [`EmptyWorkingSet`](https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-emptyworkingset)
10	/// function.
11	pub fn EmptyWorkingSet(&self) -> SysResult<()> {
12		bool_to_sysresult(unsafe { ffi::EmptyWorkingSet(self.ptr()) })
13	}
14
15	/// [`EnumProcessModules`](https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocessmodules)
16	/// function.
17	#[must_use]
18	pub fn EnumProcessModules(&self) -> SysResult<Vec<HINSTANCE>> {
19		loop {
20			let mut bytes_needed = 0u32;
21			bool_to_sysresult(unsafe {
22				ffi::EnumProcessModules(self.ptr(), std::ptr::null_mut(), 0, &mut bytes_needed)
23			})?;
24
25			let elems_needed = bytes_needed / (std::mem::size_of::<HINSTANCE>() as u32);
26			let mut buf = (0..elems_needed)
27				.map(|_| HINSTANCE::NULL)
28				.collect::<Vec<_>>();
29
30			let mut bytes_got = 0u32;
31			bool_to_sysresult(unsafe {
32				ffi::EnumProcessModules(
33					self.ptr(),
34					buf.as_mut_ptr() as _,
35					bytes_needed,
36					&mut bytes_got,
37				)
38			})?;
39
40			if bytes_needed == bytes_got {
41				return Ok(buf);
42			}
43		}
44	}
45
46	/// [`GetMappedFileName`](https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmappedfilenamew)
47	/// function.
48	#[must_use]
49	pub fn GetMappedFileName(&self, address: *mut std::ffi::c_void) -> SysResult<String> {
50		let mut buf = WString::new_alloc_buf(MAX_PATH + 1); // arbitrary
51		bool_to_sysresult(unsafe {
52			ffi::GetMappedFileNameW(self.ptr(), address, buf.as_mut_ptr(), buf.buf_len() as _)
53		})
54		.map(|_| buf.to_string())
55	}
56
57	/// [`GetModuleBaseName`](https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmodulebasenamew)
58	/// function.
59	#[must_use]
60	pub fn GetModuleBaseName(&self, hmodule: Option<&HINSTANCE>) -> SysResult<String> {
61		let mut buf = WString::new_alloc_buf(MAX_PATH + 1); // arbitrary
62		bool_to_sysresult(unsafe {
63			ffi::GetModuleBaseNameW(
64				self.ptr(),
65				hmodule.map_or(std::ptr::null_mut(), |h| h.ptr()),
66				buf.as_mut_ptr(),
67				buf.buf_len() as _,
68			)
69		})
70		.map(|_| buf.to_string())
71	}
72
73	/// [`GetModuleFileNameEx`](https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmodulefilenameexw)
74	/// function.
75	#[must_use]
76	pub fn GetModuleFileNameEx(&self, hmodule: Option<&HINSTANCE>) -> SysResult<String> {
77		let mut buf = WString::new_alloc_buf(MAX_PATH + 1); // arbitrary
78		bool_to_sysresult(unsafe {
79			ffi::GetModuleFileNameExW(
80				self.ptr(),
81				hmodule.map_or(std::ptr::null_mut(), |h| h.ptr()),
82				buf.as_mut_ptr(),
83				buf.buf_len() as _,
84			)
85		})
86		.map(|_| buf.to_string())
87	}
88
89	/// [`GetModuleInformation`](https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmoduleinformation)
90	/// function.
91	#[must_use]
92	pub fn GetModuleInformation(&self, hmodule: Option<&HINSTANCE>) -> SysResult<MODULEINFO> {
93		let mut mi = MODULEINFO::default();
94		bool_to_sysresult(unsafe {
95			ffi::GetModuleInformation(
96				self.ptr(),
97				hmodule.map_or(std::ptr::null_mut(), |h| h.ptr()),
98				pvoid(&mut mi),
99				std::mem::size_of::<MODULEINFO>() as _,
100			)
101		})
102		.map(|_| mi)
103	}
104
105	/// [`GetProcessImageFileName`](https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getprocessimagefilenamew)
106	/// function.
107	#[must_use]
108	pub fn GetProcessImageFileName(&self) -> SysResult<String> {
109		let mut buf = WString::new_alloc_buf(MAX_PATH + 1); // arbitrary
110		bool_to_sysresult(unsafe {
111			ffi::GetProcessImageFileNameW(self.ptr(), buf.as_mut_ptr(), buf.buf_len() as _)
112		})
113		.map(|_| buf.to_string())
114	}
115
116	/// [`GetProcessMemoryInfo`](https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getprocessmemoryinfo)
117	/// function.
118	#[must_use]
119	pub fn GetProcessMemoryInfo(&self) -> SysResult<PROCESS_MEMORY_COUNTERS_EX> {
120		let mut pmc = PROCESS_MEMORY_COUNTERS_EX::default();
121		bool_to_sysresult(unsafe {
122			ffi::GetProcessMemoryInfo(
123				self.ptr(),
124				pvoid(&mut pmc),
125				std::mem::size_of::<PROCESS_MEMORY_COUNTERS_EX>() as _,
126			)
127		})
128		.map(|_| pmc)
129	}
130}